home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / rodent_3.arc / QCRODENT.C < prev    next >
Text File  |  1991-04-28  |  7KB  |  192 lines

  1. /*********************************************************/
  2. /*                    qcrodent.c                         */
  3. /*                                                       */
  4. /*  Demo program to show how to define a mouse graphics  */
  5. /*  cursor.                                              */
  6. /*                                                       */
  7. /*  Written in Microsoft QuickC version 2.01.            */
  8. /*                                                       */
  9. /*  Hardware req'ts : CGA, EGA, or VGA                   */
  10. /*                    Microsoft-compatible mouse         */
  11. /*                                                       */
  12. /*********************************************************/
  13.  
  14. #include <dos.h>
  15. #include <stdio.h>
  16. #include <graph.h>
  17.  
  18. /* Define an hourglass-shaped mouse graphics cursor */
  19. unsigned mcursor[2][16] =
  20.   {
  21.     /* Screen mask; this is ANDed with screen */
  22.     {
  23.       0x0001,     /* 0000000000000001 */
  24.       0x0001,     /* 0000000000000001 */
  25.       0x8003,     /* 1000000000000011 */
  26.       0xc7c7,     /* 1100011111000111 */
  27.       0xe38f,     /* 1110001110001111 */
  28.       0xf11f,     /* 1111000100011111 */
  29.       0xf83f,     /* 1111100000111111 */
  30.       0xfc7f,     /* 1111110001111111 */
  31.       0xf83f,     /* 1111100000111111 */
  32.       0xf11f,     /* 1111000100011111 */
  33.       0xe38f,     /* 1110001110001111 */
  34.       0xc7c7,     /* 1100011111000111 */
  35.       0x8003,     /* 1000000000000011 */
  36.       0x0001,     /* 0000000000000001 */
  37.       0x0001,     /* 0000000000000001 */
  38.       0x0000,     /* 0000000000000000 */
  39.     },
  40.     /* Cursor mask; this is XORed with screen */
  41.     {
  42.       0x0000,     /* 0000000000000000 */
  43.       0x7ffc,     /* 0111111111111100 */
  44.       0x2008,     /* 0010000000001000 */
  45.       0x1010,     /* 0001000000010000 */
  46.       0x0820,     /* 0000100000100000 */
  47.       0x0440,     /* 0000010001000000 */
  48.       0x0280,     /* 0000001010000000 */
  49.       0x0100,     /* 0000000100000000 */
  50.       0x0280,     /* 0000001010000000 */
  51.       0x0440,     /* 0000010001000000 */
  52.       0x0820,     /* 0000100000100000 */
  53.       0x1010,     /* 0001000000010000 */
  54.       0x2008,     /* 0010000000001000 */
  55.       0x7ffc,     /* 0111111111111100 */
  56.       0x0000,     /* 0000000000000000 */
  57.       0x0000      /* 0000000000000000 */
  58.     }
  59.   };
  60.  
  61. union  REGS  regs;   /* 80x86 processor registers */
  62. struct SREGS sregs;  /* segment registers */
  63.  
  64. /* function prototypes */
  65. void msgetstatus(int *, int *, int *); /* get cursor loc & buttons */
  66. void mshidecur(void); /* hide mouse cursor */
  67. int  msinit(void);    /* initialize mouse driver, return # of buttons */
  68. void mssetcur(void);  /* set mouse cursor shape */
  69. void msshowcur(void); /* show (unhide) mouse cursor */
  70. void showbutton(int, int);
  71.  
  72. main()
  73. {
  74.   int buttons;                        /* # of mouse buttons      */
  75.   int mouse_x, mouse_y, mouse_button; /* Mouse loc & button info */
  76.   int rightbutton;
  77.   /* Set video to CGA 640x200 BW mode */
  78.   if (!_setvideomode(_HRESBW))
  79.   {
  80.     puts("This program requires a CGA or other color adapter!");
  81.     exit(1);
  82.   }
  83.   /*  msinit() return button count; 0 = no mouse */
  84.   if (!(buttons = msinit()))
  85.   {
  86.     puts("No mouse detected.");
  87.     exit(1);
  88.   }
  89.   if (buttons == 3)  /* determine where right button will be shown */
  90.     rightbutton = 42;
  91.   else
  92.     rightbutton = 35;
  93.   puts("╔════╗                    ┌───┐  ┌───┐");
  94.   puts("║QUIT║  x = xxx  y = yyy  │   │  │   │");
  95.   puts("╚════╝                    └───┘  └───┘");
  96.   if (buttons == 3)
  97.   {
  98.     _settextposition(1, rightbutton - 1);
  99.     _outtext("┌───┐");
  100.     _settextposition(2, rightbutton - 1);
  101.     _outtext("│   │");
  102.     _settextposition(3, rightbutton - 1);
  103.     _outtext("└───┘");
  104.   }
  105.   mssetcur();   /* Set mouse cursor to mcursor */
  106.   msshowcur();  /* Show mouse cursor */
  107.  
  108.   do  /* main program loop */
  109.   {
  110.     msgetstatus(&mouse_x, &mouse_y, &mouse_button);
  111.     _settextposition(2, 13);
  112.     printf("%3d", mouse_x);
  113.     _settextposition(2, 22);
  114.     printf("%3d", mouse_y);
  115.     showbutton(28, mouse_button & 1);
  116.     showbutton(rightbutton, mouse_button & 2);
  117.     if (buttons == 3)
  118.       showbutton(35, mouse_button & 4);
  119.   } while (mouse_button != 1 || mouse_x > 48 || mouse_y > 24);
  120.   mshidecur();
  121.   _setvideomode(_DEFAULTMODE);  /* reset screen */
  122. }  /* end main */
  123.  
  124. /**********************************************************************/
  125. /* get cursor location and button status                              */
  126. void msgetstatus(int *ms_x, int *ms_y, int *ms_b)
  127. {
  128.   regs.x.ax = 3;  /* function 3 = get status */
  129.   int86(0x33, ®s, ®s);
  130.   *ms_x = regs.x.cx; /* horizontal cursor location */
  131.   *ms_y = regs.x.dx; /* vertical cursor location */
  132.   *ms_b = regs.x.bx; /* button info: 1 = left, 2 = right, 4 = center */
  133.        /* note that the button bits are independent of each other;   */
  134.        /* ie., if the left and right buttons are both pressed the    */
  135.        /* returned button value is 3.                                */
  136. } /* end msgetstatus */
  137.  
  138. /**********************************************************************/
  139. /* hide mouse cursor                                                  */
  140. void mshidecur(void)
  141. {
  142.   regs.x.ax = 2;  /* function 2 */
  143.   int86(0x33, ®s, ®s);
  144. } /* end mshidecur */
  145.  
  146. /**********************************************************************/
  147. /* initialize mouse driver & return number of buttons                 */
  148. /* Uses int 33h function 0.  If mouse detected, the interrupt returns */
  149. /* a non-zero value in AX                                             */
  150. int msinit(void)
  151. {
  152.   regs.x.ax = 0;  /* function 0 is init driver */
  153.   if (int86(0x33, ®s, ®s))
  154.     return(regs.x.bx);
  155.   else
  156.     return(0);
  157. } /* end msinit */
  158.  
  159. /**********************************************************************/
  160. /* set up new cursor image via function 9.  Bit mask for new cursor   */
  161. /* is in ES:DX, cursor hot spot is in BX and CX                       */
  162. void mssetcur(void)
  163. {
  164.   segread(&sregs);  /* get segment registers */
  165.   sregs.ds = sregs.es; /* set ES to data segment */
  166.   regs.x.ax = 9;  /* function 9 */
  167.   regs.x.bx = 7;  /* set horiz. hot spot to midpoint of hourglass */
  168.   regs.x.cx = 7;  /* likewise for vertical hot spot */
  169.   regs.x.dx = (unsigned)mcursor; /* ptr to mask */
  170.   int86x(0x33, ®s, ®s, &sregs); /* do it */
  171. } /* end mssetcur */
  172.  
  173. /**********************************************************************/
  174. /* show mouse cursor.  function 0 (initialize)  leaves the cursor     */
  175. /* hidden so we have to explicitly turn it on.                        */
  176. void msshowcur(void)
  177. {
  178.   regs.x.ax = 1;  /* function 1 */
  179.   int86(0x33, ®s, ®s);
  180. } /* end msshowcur */
  181.  
  182. /**********************************************************************/
  183. /* Light or blank a block to show button press                        */
  184. void showbutton(int loc, int condition)
  185. {
  186.   _settextposition(2, loc);
  187.   if(condition)  /* if the button is pressed */
  188.     _outtext("███"); /* light it up */
  189.   else
  190.     _outtext("   "); /* else turn it off */
  191. }
  192.